# -*-coding: Utf-8 -*-
# @File : constant .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time：2024/7/1
import abc
# 系统常量


# 错误码规范
# 【一】 错误码类型必须为字符串类型
# 【1】错误码分为两部分
# 错误产生来源 + 四位数字编号
# 【2】错误码来源
# A:来源于用户，比如参数错误，用户版本过低
# B:来源于系统，比如系统错误，往往是业务逻辑出错，或程序健壮性差等问题
# C:错误来源于第三方服务，比如 CDN 服务出错，消息投递超时等问题

# 四位数字编号：从 0001 到 9999 ，大类之间的步长间距预留 100

# 【二】编号不与公司业务架构，更不与组织架构挂钩
# 一切与平台先到先申请的原则进行，审批生效，编号被永久固定

from enum import Enum
from abc import ABC, abstractmethod


# 假设IErrorCode接口已经被实现或替换为Python中的基类或抽象类
class IErrorCode(ABC):
    @abstractmethod
    def code(self) -> str:
        pass

    @abstractmethod
    def message(self) -> str:
        pass


class BaseErrorCode(Enum):
    """
    Base error codes definition, categorized into different levels and scenarios.
    """

    # ========== 一级宏观错误码 客户端错误 ==========
    CLIENT_ERROR = ("A000001", "用户端错误")

    # ========== 二级宏观错误码 用户注册错误 ==========
    USER_REGISTER_ERROR = ("A000100", "用户注册错误")
    USER_NAME_VERIFY_ERROR = ("A000110", "用户名校验失败")
    USER_NAME_EXIST_ERROR = ("A000111", "用户名已存在")
    USER_NAME_SENSITIVE_ERROR = ("A000112", "用户名包含敏感词")
    USER_NAME_SPECIAL_CHARACTER_ERROR = ("A000113", "用户名包含特殊字符")
    PASSWORD_VERIFY_ERROR = ("A000120", "密码校验失败")
    PASSWORD_SHORT_ERROR = ("A000121", "密码长度不够")
    PHONE_VERIFY_ERROR = ("A000151", "手机格式校验失败")

    # ========== 二级宏观错误码 系统请求缺少幂等Token ==========
    IDEMPOTENT_TOKEN_NULL_ERROR = ("A000200", "幂等Token为空")
    IDEMPOTENT_TOKEN_DELETE_ERROR = ("A000201", "幂等Token已被使用或失效")

    # ========== 一级宏观错误码 系统执行出错 ==========
    SERVICE_ERROR = ("B000001", "系统执行出错")
    # ========== 二级宏观错误码 系统执行超时 ==========
    SERVICE_TIMEOUT_ERROR = ("B000100", "系统执行超时")

    # ========== 一级宏观错误码 调用第三方服务出错 ==========
    REMOTE_ERROR = ("C000001", "调用第三方服务出错")

    def __init__(self, code: str, message: str):
        self._code = code
        self._message = message
        super().__init__()

    def code(self) -> str:
        """Implement the code method from IErrorCodeProtocol."""
        return self._code

    def message(self) -> str:
        """Implement the message method from IErrorCodeProtocol."""
        return self._message


class UserErrorCode(Enum):
    """Implement the UserErrorCode class."""

    # ========== 一级宏观错误码 用户请求参数校验失败 ==========
    USER_PARAM_ERROR = ("A000200", "用户请求参数校验失败")
    USER_USERNAME_NULL_ERROR = ("A000201", "用户名不能为空")
    USER_PASSWORD_NULL_ERROR = ("A000202", "密码不能为空")
    USER_PASSWORD_FORMAT_ERROR = ("A000203", "密码格式不正确")
    USER_USER_NAME_FORMAT_ERROR = ("A000204", "用户名格式不正确")
    USER_USERNAME_EXIST_ERROR = ("A000205", "用户名已经存在")
    USER_PASSWORD_ERROR = ("A000206", "密码错误")
    USER_USERNAME_NULL = ("A000207", "用户不存在")

    def __init__(self, code: str, message: str):
        self._code = code
        self._message = message
        super().__init__()

    def code(self) -> str:
        """Implement the code method from IErrorCodeProtocol."""
        return self._code

    def message(self) -> str:
        """Implement the message method from IErrorCodeProtocol."""
        return self._message
